home *** CD-ROM | disk | FTP | other *** search
/ PC Player 2004 May / pc player 2004-05.iso / Demos / FarCry / Data1.cab / _5DB6B5CC46C94AFF997BFA27B01EE6BD < prev    next >
Encoding:
Text File  |  2004-01-06  |  6.4 KB  |  258 lines

  1. ----------------------------------------------------------------------------
  2. --
  3. -- Description :        Impulse trigger - gives a (continuous) impulse to the player
  4. --
  5. -- Created by Luciano :    May 03 2003
  6. --
  7. ----------------------------------------------------------------------------
  8. ImpulseTrigger = {
  9.     type = "Trigger",
  10.  
  11.     Properties = {
  12.         DimX = 5,
  13.         DimY = 5,
  14.         DimZ = 5,
  15.         bEnabled=1,
  16.         bTriggerOnce=0,
  17.         bKillOnTrigger=0,
  18.         bOnlyPlayer=0,
  19.         bOnlyMyPlayer=1,
  20.         bOnlyAI = 0,
  21.         ImpulseStrength = 20,
  22.         ImpulseFadeInTime = 0.0,
  23.         ImpulseDuration = 0.1,
  24.     },
  25.  
  26.     imp = {x=0,y=0,z=0},
  27.     MaxImpulse = 0, 
  28.     InitImpulseTime = 0,
  29.     TotalImpulseDuration = 0,
  30.     Editor={
  31.         Model="Objects/Editor/T.cgf",
  32.     },
  33. }
  34.  
  35. function ImpulseTrigger:OnPropertyChange()
  36.     self:OnReset();
  37. end
  38.  
  39. function ImpulseTrigger:OnInit()
  40.     self.Who = nil;
  41.     self.Entered = 0;
  42.  
  43.     self:RegisterState("Inactive");
  44.     self:RegisterState("Empty");
  45.     self:RegisterState("Occupied");
  46.     self:OnReset();
  47.     self:EnableUpdate(0);
  48.     self:TrackColliders(1);
  49. end
  50.  
  51. function ImpulseTrigger:OnShutDown()
  52. end
  53.  
  54. function ImpulseTrigger:OnSave(stm)
  55.     --WriteToStream(stm,self.Properties);
  56. end
  57.  
  58.  
  59. function ImpulseTrigger:OnLoad(stm)
  60.     --self.Properties=ReadFromStream(stm);
  61.     --self:OnReset();
  62. end
  63.  
  64. function ImpulseTrigger:OnReset()
  65.  
  66.     self.imp = new(self:GetDirectionVector());
  67.  
  68.     local Min = { x=-self.Properties.DimX/2, y=-self.Properties.DimY/2, z=-self.Properties.DimZ/2 };
  69.     local Max = { x=self.Properties.DimX/2, y=self.Properties.DimY/2, z=self.Properties.DimZ/2 };
  70.     self:SetBBox( Min, Max );
  71.     --System.LogToConsole( "BBox:"..Min.x..","..Min.y..","..Min.z.."  "..Max.x..","..Max.y..","..Max.z );
  72.     self.Who = nil;
  73.  
  74.     self.Entered = 0;
  75.     self.TotalImpulseDuration = self.Properties.ImpulseFadeInTime + self.Properties.ImpulseDuration;
  76.     
  77.     if(self.Properties.bEnabled==1)then
  78.         self:GotoState( "Empty" );
  79.     else
  80.         self:GotoState( "Inactive" );
  81.     end
  82.  
  83. --    AI:RegisterWithAI(self.id, AIAnchor[self.Properties.aianchorAIAction]);
  84. end
  85.  
  86. function ImpulseTrigger:Event_Enter( sender )
  87. --    self.imp = self:GetDirectionVector();
  88.  
  89.     if ((self.Entered ~= 0)) then
  90.         do return end
  91.     end
  92. --    self.Entered = 1;
  93.  
  94.     --Hud:AddMessage("Enter!");
  95.  
  96.     AI:RegisterWithAI(self.id, 0);
  97.  
  98.     BroadcastEvent( self,"Enter" );
  99.  
  100.     
  101.     self.Entered = 1;
  102.  
  103. --        self.InitialAngle = new(self.boat:GetAngles());
  104.  
  105.     self.InitImpulseTime = _time;
  106.     self:SetTimer(1);
  107.  
  108.     if (self.Who == nil) then
  109.         self.Who = sender;
  110.         self:GotoState( "Occupied" );
  111.     end
  112.             
  113.  
  114.     --if ( sender ) then
  115.         --System:LogToConsole( "Player "..sender:GetName().." Enter ImpulseTrigger "..self:GetName() );
  116.     --end
  117. end
  118.  
  119. function ImpulseTrigger:Event_Leave( sender )
  120.     if (self.Entered == 0) then
  121.         do return end
  122.     end
  123.     self.Entered = 0;
  124.     --Hud:AddMessage("Leave");
  125.     --if (sender ~= nil) then
  126.         --System:LogToConsole( "Player "..sender:GetName().." Leave ImpulseTrigger "..self:GetName() );
  127.     --end
  128.     BroadcastEvent( self,"Leave" );
  129.  
  130. end
  131.  
  132. function ImpulseTrigger:Event_Enable( sender )
  133.     self:GotoState("Empty")
  134.     BroadcastEvent( self,"Enable" );
  135. end
  136.  
  137. function ImpulseTrigger:Event_Disable( sender )
  138.     self:GotoState( "Inactive" );
  139.     AI:RegisterWithAI(self.id, 0);
  140.     BroadcastEvent( self,"Disable" );
  141. end
  142.  
  143. function ImpulseTrigger:OnTimeF()
  144.     
  145.     local coeff;
  146.  
  147.     if(self.Who) then
  148.         if(self.Properties.ImpulseFadeInTime >0) then
  149.             coeff = (_time - self.InitImpulseTime)/self.Properties.ImpulseFadeInTime;
  150.         else
  151.             coeff = 1; -- assume a duration = 1 
  152.         end
  153.  
  154.         if (coeff > 1) then
  155.             coeff = 1;
  156.         end
  157.         
  158.         self.Who:AddImpulseObj( self.imp, self.Properties.ImpulseStrength * coeff);
  159.  
  160.         if ((_time - self.InitImpulseTime >= self.TotalImpulseDuration) and (self.TotalImpulseDuration >=0)) then
  161.             -- there's no way to detect end of collision, let's automatically force it after 2 seconds
  162.             self:SetTimer(2000); 
  163.             self.Who = nil;
  164.         else
  165.             self:SetTimer(1);
  166.         end
  167.     else
  168.         self:Event_Leave( self,self.Who );
  169.         if(self.Properties.bKillOnTrigger > 0)then
  170.             Server:RemoveEntity(self.id);
  171.         elseif(self.Properties.bTriggerOnce > 0)then
  172.             self:GotoState("Inactive");
  173.         else
  174.             self:GotoState("Empty");
  175.         end
  176.         self:KillTimer();
  177.     end        
  178. end
  179.  
  180.  
  181.  
  182. -------------------------------------------------------------------------------
  183. -- Inactive State -------------------------------------------------------------
  184. -------------------------------------------------------------------------------
  185. ImpulseTrigger.Inactive =
  186. {
  187.     OnBeginState = function( self )
  188.         printf("ImpulseTrigger deactivating");
  189.     end,
  190.     OnEndState = function( self )
  191.         printf("ImpulseTrigger activating");
  192.     end,
  193. }
  194. -------------------------------------------------------------------------------
  195. -- Empty State ----------------------------------------------------------------
  196. -------------------------------------------------------------------------------
  197. ImpulseTrigger.Empty =
  198. {
  199.     -------------------------------------------------------------------------------
  200.     OnBeginState = function( self )
  201.         self.Who = nil;
  202.         --self.Entered = 0;
  203.             
  204.     end,
  205.  
  206.  
  207.     -------------------------------------------------------------------------------
  208.     OnEnterArea = function( self,entity )
  209.         if (self.Properties.bOnlyPlayer ~= 0 and entity.type ~= "Player")     then
  210.             do return end
  211.         end
  212.  
  213.         -- if Only for AI, then check
  214.         if (self.Properties.bOnlyAI ~=0 and entity.ai == nil) then
  215.             do return end
  216.         end
  217.  
  218.         -- Ignore if not my player.
  219.         if (self.Properties.bOnlyMyPlayer ~= 0 and entity ~= _localplayer) then
  220.             do return end
  221.         end
  222.  
  223.         if (self.Who==nil) then
  224.             self.Who = entity;
  225.             self:GotoState( "Occupied" );
  226.         end
  227.     end,
  228.  
  229.     OnTimer = ImpulseTrigger.OnTimeF,    
  230.  
  231. }
  232.  
  233. -------------------------------------------------------------------------------
  234. -- Empty State ----------------------------------------------------------------
  235. -------------------------------------------------------------------------------
  236. ImpulseTrigger.Occupied =
  237. {
  238.     -------------------------------------------------------------------------------
  239.     OnBeginState = function( self )
  240.         self:Event_Enter(self.Who);
  241.         --Hud:AddMessage("Enter area");
  242.     end,
  243.  
  244.     -------------------------------------------------------------------------------
  245.     OnTimer = ImpulseTrigger.OnTimeF,
  246.  
  247.     -------------------------------------------------------------------------------
  248.     --OnLeaveArea = function( self,player,areaId )
  249.         --self:Event_Leave(self.Who);
  250.     --end,
  251.  
  252.     -------------------------------------------------------------------------------
  253.  
  254.  
  255. }
  256.  
  257.  
  258.